#ifndef WORK_THREAD_H_
#define WORK_THREAD_H_

#include <list>
#include <mutex>
#include <thread>

class WorkGroup;
struct event_base;
struct event;
class SocketManager;
class NetBus;
/// @brief 工作线程
class WorkThread
{
public:
    /// @brief 构造函数
    /// @param parent 父线程组
    /// @param id 当前线程id，由线程组管理指定，作为标识
    /// @param net_bus 消息总线，由线程组创建，在外部释放
    WorkThread(WorkGroup *parent, int id, NetBus *net_bus);
    /// @brief 初始化
    bool Init();
    /// @brief 启动函数
    void Start();
    /// @brief 停止函数
    void Stop();
    /// @brief 管道方法
    /// @param sign 'c'激活建立新连接，'e'激活从消息总线上读取消息
    void Notify(const char *sign);
    /// @brief 管道响应方法
    void Activated(int fd);
    /// @brief 添加连接套接字进入队列等待线程激活后来读取
    void AddSocket(int sock);
    /// @brief 当前保持的连接数量
    int connect_num() const;
    int work_id() const;
    virtual ~WorkThread();
    /// @brief 连接关闭回调
    /// @param m 客户端连接
    void Disconnect(SocketManager *m);
    /// @brief 向消息总线发送消息
    /// @param header 消息头
    /// @param header_size 消息头大小
    /// @param data 数据
    /// @param data_size 数据大小
    void SendToNetBus(const char *header, int header_size, const char *data, int data_size);

protected:
    /// @brief 线程运行函数
    virtual void Run();

private:
    int id_ = 0;
    WorkGroup *parent_ = nullptr;
    NetBus *net_bus_ = nullptr;
    event_base *ev_base_ = nullptr;
    int pipe_endpoint_ = -1;
    std::list<int> socket_list_;
    std::mutex socket_list_mtx_;
    // 当前保持的连接管理队列
    std::list<SocketManager *> sock_manager_list_;
    std::thread *run_thread_;
    event *pipe_ev_ = nullptr;
    // 线程退出标识
    bool thread_exit_ = false;
};

#endif